/**
 * Ukazkova funkce pro praci s moduly.
 * Predvadi ukazku inicializacni a cleanup funkci, funkci printk
 * @autor Radek Necas, xnecas18@stud.fit.vutbr.cz
 *        FIT, VUT Brno
 * @date 2013
 */


// Tyto hlavicky musi byt vzdy vlozeny
#include <linux/module.h>
#include <linux/kernel.h>

#include <linux/sched.h>
#include <linux/pid.h>
#include <linux/pid_namespace.h>
#include <linux/slab.h>


#define STARTLEN 20
#define INCREASELEN 10

typedef struct processInfo {
    int pid;
    const char *name;
} tProcessInfo;

/** 
 * Funkce je automaticky zaregistrovana jako inicializacni funkce modulu.
 * Tzn. je spustena pri zavedeni modulu
 * @return 0 - OK, jinak chyba
 */
int init_module(void)
{
    printk(KERN_INFO "Zavedeni modulu findPid.\n");
/*  printk(KERN_INFO "Aktualni proces: %s[%d]\n.", current->comm, current->pid);

    struct pid *p = current->pids[PIDTYPE_PID].pid;
    struct pid_namespace *ns = ns_of_pid(p);
    int level = ns->level;
    printk(KERN_INFO "Namespace->level: %d", level);
    printk(KERN_INFO "PID: %d\n", p->numbers[level].nr);
*/
    struct task_struct *task;
    struct list_head *list;
    int arrayLen = STARTLEN;
    int pInfoSize = sizeof(tProcessInfo);
    tProcessInfo *processArray = (tProcessInfo *)kmalloc(arrayLen*pInfoSize, GFP_KERNEL);

    // Ziskani info o vsech procesich
    int i = 0, j = 0;
    for_each_process(task) {
        if(i >= arrayLen) {
            arrayLen += INCREASELEN;
            processArray = (tProcessInfo *)krealloc(processArray, arrayLen*pInfoSize, GFP_KERNEL); 
        }
        processArray[i].pid = task->pid;
        processArray[i].name = task->comm;
        i++;
    }

    // Vypsani vsech uchovanych informaci
    for(j = 0; j < i; j++) {
        printk(KERN_INFO "Proces: %s[%d]\n", processArray[j].name, processArray[j].pid);
    } 

    kfree(processArray);

    return 0;
}

/** 
 * Funkce je automaticky zaregistrovana jako clean(exit) funkce.
 * Tzn. je spustena automaticky pri odebirani modulu
 */
void cleanup_module(void)
{
    printk(KERN_INFO "Odebrani modulu findPid.\n");
}
